#ifndef _EFF50ED7_AA2B_4543_9F9C_B08641D30EFA
#define _EFF50ED7_AA2B_4543_9F9C_B08641D30EFA

#include "depends/incfile.h"

namespace x2lib
{
	class HttpUtil
	{
	public:

		/*************************************************************************
		** Desc		: 切换当前应用的工作目录
		** Param	: [pDir] 欲创建的目录，可以是多级；忽略pDir是否以“/”或“\”结尾
		** Return	: 成功返回true，失败返回false
		** Author	: xktesla@2016-10-30 21:26:21
		*************************************************************************/
		static bool Download(const char szUrl[], uint8_t *pData, int *pnData, int iStart = 0, int iEnd = -1);
		static bool Upload(const char szUrl[], char szFileName[], uint8_t *pData, int nData, int iStart = 0, int iEnd = -1);

		// Post 请求也可以将请求数据写在请求行中，跟Get请求一样

		/*************************************************************************
		** Desc     : DoRequest
		** Param    : [in] szUrl 如果仅为网址，则必须以“/”结尾
		**          : [in] mapParams
		**          : [out] pData 保存返回数据，为NULL则不保存返回数据
		**          : [io] pnData 输入时表示pData的总大小，返回pData实际的数据大小
		**          : [io] pMethod
		**          : [io] iStart
		**          : [io] iEnd
		** Return   : 是否成功
		** Author   : xktesla
		*************************************************************************/
		static bool DoRequest(const char szUrl[], std::map<char*, char*> &mapParams, uint8_t *pData, int *pnData, const char *pMethod = "GET", int iStart = 0, int iEnd = -1);
        static bool DoRequest(const char szUrl[], std::map<std::string, std::string>* pmapParams, uint8_t *pData, int *pnData, const char *pMethod = "GET", int iStart = 0, int iEnd = -1);
		static std::string DoRequest(const char* pszUrl, int port = 80, std::map<std::string, std::string>* pmapParams = nullptr, const char *pMethod = "GET");

		/*************************************************************************
		** Desc     : 解析请求
		** Param    : [in] pData
		**          : [in] nData
		**          : [out] ppUrl 保存解析后的url，即Get字段后的值的指针
		**          : [out] pnUrl 保存解析后url的长度
		**          : [out] ppForm 保存解析后的内容指针，即\r\n\r\n后的数据
		**          : [out] pnForm 保存解析后内容的长度
		** Return   : 是否解析成功
		** Author   : xktesla
		*************************************************************************/
		static bool ParseRequest(char *pData, int nData, char **ppUrl, int *pnUrl, char **ppForm, int *pnForm);

		/*************************************************************************
		** Desc     : 将pData进行打包，并存储到pData，若nData过小会返回false
		** Param    : [in] nCode 返回代码，如200表示ok
		**          : [io] pData 传入时表示要返回的数据，传出时表示打包后的数据
		**          : [io] pnData 传入时表示要返回的数据大小，传出时表示打包后的数据大小
		**          : [in] nCapacity pData的总大小
		** Return   : 是否打包成功
		** Author   : xktesla
		*************************************************************************/
		static bool PackResponse(int nCode, void *pData, int *pnData, int nCapacity);

		// xktesla@2019-8-20 18:41:35 coding 暂未确定是否有窄字符和宽字符之分
		static bool IsHttpRequest(char *pData, int nData);
		static bool IsHttpResponse(char *pData, int nData);

        static bool Parse302Url(char* pData, int nData, char szNewUrl[], int nNewUrl);

		/*************************************************************************
		** Desc		:
		** Param	: [in] szWebUrl
		**			: [out] szWWW
		**			: [out] szPath
		**			: [out] pnPort 端口号
		**			: [out] pisHttps
		** Return	:
		** Author	: xktesla@2019-8-25 10:06:58
		*************************************************************************/
		static bool ParseWebUrl(const char *szWebUrl, struct in_addr* pin_addr, char szWWW[], char szPath[], int *pnPort, bool *pisHttps);
	};

}

#endif

